package com.nicolascarrascob.pds.serviciosoap.biz;

import java.util.ArrayList;
import java.util.HashMap;

import org.orm.PersistentException;
import org.orm.PersistentTransaction;

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.nicolascarrascob.pds.serviciosoap.orm.Clasificacion;
import com.nicolascarrascob.pds.serviciosoap.orm.Genero;
import com.nicolascarrascob.pds.serviciosoap.orm.Pelicula;
import com.nicolascarrascob.pds.serviciosoap.orm.Sala;
import com.nicolascarrascob.pds.serviciosoap.orm.dao.PeliculaDAO;
import com.nicolascarrascob.pds.serviciosoap.orm.dao.SalaDAO;

/**
 * The Class CarteleraDeCineORM.
 */
public class CarteleraDeCineORM {

	/**
	 * Instantiates a new cartelera de cine orm.
	 */
	public CarteleraDeCineORM() {
		super();
	}

	/**
	 * Gets the cartelera.
	 *
	 * @return the cartelera
	 */
	public String getCartelera(){
		String resultJSON = "";
		ArrayList<HashMap<String, Object>> listPeliculas = new ArrayList<HashMap<String,Object>>();

		com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory lDAOFactory = com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory.getDAOFactory();
		System.out.println("Listing Pelicula...");
		Pelicula[] peliculas;
		try {
			peliculas = lDAOFactory.getPeliculaDAO().listPeliculaByQuery(null, null);
			int length = peliculas.length;
			System.out.println(length + " record(s) retrieved.");
			for (int i = 0; i < length; i++) {
				System.out.println(peliculas[i]);
				HashMap<String, Object> mapPeliculas = new HashMap<String, Object>();
				mapPeliculas.put("Id", peliculas[i].getId());
				mapPeliculas.put("Titulo", peliculas[i].getNombre());
				mapPeliculas.put("Clasificacion", peliculas[i].getClasificacion().getNombre());
				mapPeliculas.put("Estreno", peliculas[i].getEstreno() == 1? "Si" : "No");
				mapPeliculas.put("Descripcion", peliculas[i].getDescripcion());
				mapPeliculas.put("Genero", peliculas[i].getGenero().getNombre());
				listPeliculas.add(mapPeliculas);
			}

		} catch (PersistentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		Gson gson = new Gson();
		resultJSON = gson.toJson(listPeliculas);
		return resultJSON;
	}

	/**
	 * Gets the estrenos.
	 *
	 * @return the estrenos
	 */
	public String getEstrenos(){
		String resultJSON = "";
		ArrayList<HashMap<String, Object>> listPeliculas = new ArrayList<HashMap<String,Object>>();

		com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory lDAOFactory = com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory.getDAOFactory();
		System.out.println("Listing Pelicula...");
		Pelicula[] peliculas;
		try {
			peliculas = lDAOFactory.getPeliculaDAO().listPeliculaByQuery("Pelicula.estreno = 1", null);
			int length = peliculas.length;
			System.out.println(length + " record(s) retrieved.");

			for (int i = 0; i < length; i++) {
				System.out.println(peliculas[i]);
				HashMap<String, Object> mapPeliculas = new HashMap<String, Object>();
				mapPeliculas.put("Id", peliculas[i].getId());
				mapPeliculas.put("Titulo", peliculas[i].getNombre());
				mapPeliculas.put("Clasificacion", peliculas[i].getClasificacion().getNombre());
				mapPeliculas.put("Estreno", peliculas[i].getEstreno() == 1? "Si" : "No");
				mapPeliculas.put("Descripcion", peliculas[i].getDescripcion());
				mapPeliculas.put("Genero", peliculas[i].getGenero().getNombre());
				listPeliculas.add(mapPeliculas);
			}

		} catch (PersistentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		Gson gson = new Gson();
		resultJSON = gson.toJson(listPeliculas);
		return resultJSON;
	}

	/**
	 * Gets the generos.
	 *
	 * @return the generos
	 */
	public String getGeneros(){
		String resultJSON = "";
		HashMap<String, String> listGenero = new HashMap<String,String>();

		System.out.println("Listing Genero...");
		com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory lDAOFactory = com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory.getDAOFactory();
		com.nicolascarrascob.pds.serviciosoap.orm.Genero[] generos;
		try {
			generos = lDAOFactory.getGeneroDAO().listGeneroByQuery(null, null);
			int length = generos.length;
			for (int i = 0; i < length; i++) {
				listGenero.put(generos[i].getId().toString(), generos[i].getNombre());
				System.out.println(generos[i]);
			}
			System.out.println(length + " record(s) retrieved.");
		} catch (PersistentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}


		Gson gson = new Gson();
		resultJSON = gson.toJson(listGenero);
		return resultJSON;
	}

	/**
	 * Gets the clasificaciones.
	 *
	 * @return the clasificaciones
	 */
	public String getClasificaciones(){
		String resultJSON = "";
		HashMap<String, String> listClasificaciones = new HashMap<String,String>();

		System.out.println("Listing Genero...");
		com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory lDAOFactory = com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory.getDAOFactory();
		Clasificacion[] clasificaciones;
		try {
			clasificaciones = lDAOFactory.getClasificacionDAO().listClasificacionByQuery(null, null);
			int length = clasificaciones.length;
			for (int i = 0; i < length; i++) {
				listClasificaciones.put(clasificaciones[i].getId().toString(), clasificaciones[i].getNombre());
				System.out.println(clasificaciones[i]);
			}
			System.out.println(length + " record(s) retrieved.");
		} catch (PersistentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		Gson gson = new Gson();
		resultJSON = gson.toJson(listClasificaciones);
		return resultJSON;

	}

	/**
	 * Adds the pelicula.
	 *
	 * @param peliculaJson the pelicula json
	 * @return the int
	 */
	public int addPelicula(String peliculaJson){
		int resultado = 0;
		if(peliculaJson != null && !peliculaJson.isEmpty()){
			JsonParser jsonParser = new JsonParser();
			JsonObject pelicula = jsonParser.parse(peliculaJson).getAsJsonObject();
			//Validar parametros recibidos no nulos
			System.out.println(peliculaJson);
			if(pelicula.has("nombre") && pelicula.has("descripcion") && pelicula.has("estreno") && pelicula.has("clasificacion_id") && pelicula.has("genero_id")){
				//Obtine Clasificacion y Genero

				PersistentTransaction t = null;
				try {
					t = com.nicolascarrascob.pds.serviciosoap.orm.CarteleraDeCinePersistentManager.instance().getSession().beginTransaction();
					com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory lDAOFactory = com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory.getDAOFactory();				
					Clasificacion clasificacion = lDAOFactory.getClasificacionDAO().getClasificacionByORMID(pelicula.get("clasificacion_id").getAsInt());
					Genero genero = lDAOFactory.getGeneroDAO().getGeneroByORMID(pelicula.get("genero_id").getAsInt());
					if(clasificacion != null && genero != null){
						Pelicula nuevaPelicula = new Pelicula();
						nuevaPelicula.setNombre(pelicula.get("nombre").getAsString());
						nuevaPelicula.setDescripcion(pelicula.get("descripcion").getAsString());
						nuevaPelicula.setEstreno(pelicula.get("estreno").getAsInt());
						nuevaPelicula.setClasificacion(clasificacion);
						nuevaPelicula.setGenero(genero);
						lDAOFactory.getPeliculaDAO().save(nuevaPelicula);
						resultado = 1;
					}
					t.commit();
				} catch (PersistentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					try {
						t.rollback();
					} catch (PersistentException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
			}
		}
		return resultado;
	}


	/**
	 * Adds the pelicula.
	 *
	 * @param peliculaJson the pelicula json
	 * @return the int 0 o 1
	 */
	public int updatePelicula(String peliculaJson){
		int resultado = 0;
		if(peliculaJson != null && !peliculaJson.isEmpty()){
			JsonParser jsonParser = new JsonParser();
			JsonObject pelicula = jsonParser.parse(peliculaJson).getAsJsonObject();
			//Validar parametros recibidos no nulos
			System.out.println(peliculaJson);
			if(pelicula.has("id") && pelicula.has("nombre") && pelicula.has("descripcion") 
					&& pelicula.has("estreno") && pelicula.has("clasificacion_id") && pelicula.has("genero_id")){
				
				PersistentTransaction t = null;
				try {
					t = com.nicolascarrascob.pds.serviciosoap.orm.CarteleraDeCinePersistentManager.instance().getSession().beginTransaction();
					com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory lDAOFactory = com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory.getDAOFactory();
					//Obtine Clasificacion y Genero
					Clasificacion clasificacion = lDAOFactory.getClasificacionDAO().getClasificacionByORMID(pelicula.get("clasificacion_id").getAsInt());
					Genero genero = lDAOFactory.getGeneroDAO().getGeneroByORMID(pelicula.get("genero_id").getAsInt());

					PeliculaDAO peliculaDAO = lDAOFactory.getPeliculaDAO();
					Pelicula upPelicula = peliculaDAO.loadPeliculaByQuery("Pelicula.id = " + pelicula.get("id").getAsInt(),null);

					if(clasificacion != null && genero != null && upPelicula != null){
						upPelicula.setNombre(pelicula.get("nombre").getAsString());
						upPelicula.setDescripcion(pelicula.get("descripcion").getAsString());
						upPelicula.setEstreno(pelicula.get("estreno").getAsInt());
						upPelicula.setClasificacion(clasificacion);
						upPelicula.setGenero(genero);
						peliculaDAO.save(upPelicula);
						resultado = 1;
					}
					t.commit();
				} catch (PersistentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					try {
						t.rollback();
					} catch (PersistentException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}finally{
					try {
						com.nicolascarrascob.pds.serviciosoap.orm.CarteleraDeCinePersistentManager.instance().getSession().flush();
						com.nicolascarrascob.pds.serviciosoap.orm.CarteleraDeCinePersistentManager.instance().disposePersistentManager();
					} catch (PersistentException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}

		System.out.println(resultado);
		return resultado;
	}

	/**
	 * @param peliculaId
	 * @return
	 */
	public int removePelicula(int peliculaId){
		int resultado = 0;
		if(peliculaId > 0){
			PersistentTransaction t = null;
			try {
				t = com.nicolascarrascob.pds.serviciosoap.orm.CarteleraDeCinePersistentManager.instance().getSession().beginTransaction();
				com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory lDAOFactory = com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory.getDAOFactory();
				Pelicula pelicula = lDAOFactory.getPeliculaDAO().getPeliculaByORMID(peliculaId);
				lDAOFactory.getPeliculaDAO().delete(pelicula);
				resultado = 1;
				t.commit();
			} catch (PersistentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				try {
					t.rollback();
				} catch (PersistentException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		}
		return resultado;
	}
	
	/**
	 * Gets the SalasCine.
	 *
	 * @return the Salas
	 */
	public String getSalaCine(){
		String resultJSON = "";
		ArrayList<HashMap<String, Object>> listSalas = new ArrayList<HashMap<String,Object>>();

		com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory lDAOFactory = com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory.getDAOFactory();
		System.out.println("Listing Salas...");
		Sala[] salas;
		try {
			salas = lDAOFactory.getSalaDAO().listSalaByQuery(null, null);
			int length = salas.length;
			System.out.println(length + " record(s) retrieved.");
			for (int i = 0; i < length; i++) {
				System.out.println(salas[i]);
				HashMap<String, Object> mapSalas = new HashMap<String, Object>();
				mapSalas.put("Id", salas[i].getId());
				mapSalas.put("Nombre", salas[i].getNombre());
				mapSalas.put("Butaca", salas[i].getButacas());
				mapSalas.put("Pelicula", salas[i].getPelicula().getNombre());
		//		mapSalas.put("Clasificacion", peliculas[i].getClasificacion().getNombre());
	//			mapPeliculas.put("Estreno", peliculas[i].getEstreno() == 1? "Si" : "No");
	//			mapPeliculas.put("Descripcion", peliculas[i].getDescripcion());
	//			mapPeliculas.put("Genero", peliculas[i].getGenero().getNombre());
				listSalas.add(mapSalas);
			}

		} catch (PersistentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		Gson gson = new Gson();
		resultJSON = gson.toJson(listSalas);
		return resultJSON;
	}
	
	/**
	 * @param SalaId
	 * @return
	 */
	public int removeSala(int salaId){
		int resultado = 0;
		if(salaId > 0){
			PersistentTransaction t = null;
			try {
				t = com.nicolascarrascob.pds.serviciosoap.orm.CarteleraDeCinePersistentManager.instance().getSession().beginTransaction();
				com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory lDAOFactory = com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory.getDAOFactory();
				Sala sala = lDAOFactory.getSalaDAO().getSalaByORMID(salaId);
				lDAOFactory.getSalaDAO().delete(sala);
				resultado = 1;
				t.commit();
			} catch (PersistentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				try {
					t.rollback();
				} catch (PersistentException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		}
		return resultado;
	}
	
	


/**
 * Adds the Sala de cine.
 *
 * @param salaJson the sala json
 * @return the int
 */
public int addSala(String salaJson){
	int resultado = 0;
	if(salaJson != null && !salaJson.isEmpty()){
		JsonParser jsonParser = new JsonParser();
		JsonObject sala = jsonParser.parse(salaJson).getAsJsonObject();
		//Validar parametros recibidos no nulos
		System.out.println(salaJson);
		if(sala.has("nombre") && sala.has("butacas") && sala.has("pelicula") ){
			

			PersistentTransaction t = null;
			try {
				t = com.nicolascarrascob.pds.serviciosoap.orm.CarteleraDeCinePersistentManager.instance().getSession().beginTransaction();
				com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory lDAOFactory = com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory.getDAOFactory();
				//Obtiene Pelicula	
				Pelicula pelicula = lDAOFactory.getPeliculaDAO().getPeliculaByORMID(sala.get("peliculaid").getAsInt());
		//		Clasificacion clasificacion = lDAOFactory.getClasificacionDAO().getClasificacionByORMID(sala.get("clasificacion_id").getAsInt());
	//			Genero genero = lDAOFactory.getGeneroDAO().getGeneroByORMID(sala.get("genero_id").getAsInt());
				if(pelicula != null ){
					Sala nuevaSala = new Sala();
					nuevaSala.setNombre(sala.get("nombre").getAsString());
					nuevaSala.setButacas(sala.get("butacas").getAsInt());
					nuevaSala.setPelicula(pelicula);
					lDAOFactory.getSalaDAO().save(nuevaSala);
					resultado = 1;
				}
				t.commit();
			} catch (PersistentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				try {
					t.rollback();
				} catch (PersistentException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		}
	}
	return resultado;
}

/**
 * Adds the pelicula.
 *
 * @param salaJson the pelicula json
 * @return the int 0 o 1
 */
public int updateSala(String salaJson){
	int resultado = 0;
	if(salaJson != null && !salaJson.isEmpty()){
		JsonParser jsonParser = new JsonParser();
		JsonObject sala = jsonParser.parse(salaJson).getAsJsonObject();
		//Validar parametros recibidos no nulos
		System.out.println(salaJson);
		if(sala.has("id") && sala.has("nombre") && sala.has("butacas") 
				&& sala.has("pelicula")){
			
			PersistentTransaction t = null;
			try {
				t = com.nicolascarrascob.pds.serviciosoap.orm.CarteleraDeCinePersistentManager.instance().getSession().beginTransaction();
				com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory lDAOFactory = com.nicolascarrascob.pds.serviciosoap.orm.DAOFactory.getDAOFactory();

				//Obtiene Pelicula	
				Pelicula pelicula = lDAOFactory.getPeliculaDAO().getPeliculaByORMID(sala.get("peliculaid").getAsInt());

				SalaDAO salaDAO = lDAOFactory.getSalaDAO();
				Sala upSala = salaDAO.loadSalaByQuery("Sala.id = " + sala.get("id").getAsInt(),null);				

				if(pelicula != null && upSala != null){
					upSala.setNombre(sala.get("nombre").getAsString());
					upSala.setButacas(sala.get("butacas").getAsInt());
					upSala.setPelicula(pelicula);
					salaDAO.save(upSala);
					resultado = 1;
					
				}
				t.commit();
			} catch (PersistentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				try {
					t.rollback();
				} catch (PersistentException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}finally{
				try {
					com.nicolascarrascob.pds.serviciosoap.orm.CarteleraDeCinePersistentManager.instance().getSession().flush();
					com.nicolascarrascob.pds.serviciosoap.orm.CarteleraDeCinePersistentManager.instance().disposePersistentManager();
				} catch (PersistentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	System.out.println(resultado);
	return resultado;
}


	
}
